﻿Option Explicit On
Option Strict On

Imports System
Imports System.Data
Imports System.Runtime.CompilerServices


Namespace VSProject.MicroORM

#Region "       SQLExtensions.vb - Методы-расширения       "

    ''' <summary>Общие методы для выполнения простых запросов</summary>
    Public Module SQLExtensions

        ''' <summary>Метод выполняет SQL запрос и возвращает объект IDataReader</summary>
        ''' <param name="Context">Экземпляр класса в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecReader(Context As SQLContext, ByVal SQLText As String) As IDataReader
            Return ExecReader(Context.OpenConnection, SQLText)
        End Function

        ''' <summary>Метод выполняет SQL запрос и возвращает объект IDataReader</summary>
        ''' <param name="Connection">Объект соединения в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecReader(Connection As IDbConnection, ByVal SQLText As String) As IDataReader
            Dim result As IDataReader

            Using sqlcmd As IDbCommand = Connection.CreateCommand()
                sqlcmd.CommandType = CommandType.Text
                sqlcmd.CommandText = SQLText

                result = sqlcmd.ExecuteReader()
            End Using

            Return result
        End Function


        ''' <summary>Метод выполняет SQL запрос и возвращает количество обработанных записей</summary>
        ''' <param name="Context">Экземпляр класса в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecNonQuery(Context As SQLContext, ByVal SQLText As String) As Integer
            Return ExecNonQuery(Context.OpenConnection, SQLText)
        End Function

        ''' <summary>Метод выполняет SQL запрос и возвращает количество обработанных записей</summary>
        ''' <param name="Connection">Объект соединения в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecNonQuery(Connection As IDbConnection, ByVal SQLText As String) As Integer
            Dim result As Integer

            Using sqlcmd As IDbCommand = Connection.CreateCommand()
                sqlcmd.CommandType = CommandType.Text
                sqlcmd.CommandText = SQLText

                result = sqlcmd.ExecuteNonQuery()
            End Using

            Return result
        End Function


        ''' <summary>Метод выполняет SQL запрос и возвращает скалярное значение типа Object</summary>
        ''' <param name="Context">Экземпляр класса в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecScalar(Context As SQLContext, ByVal SQLText As String) As Object
            Return ExecScalar(Context.OpenConnection, SQLText)
        End Function

        ''' <summary>Метод выполняет SQL запрос и возвращает скалярное значение типа Object</summary>
        ''' <param name="Connection">Объект соединения в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecScalar(Connection As IDbConnection, ByVal SQLText As String) As Object
            Dim result As Object

            Using sqlcmd As IDbCommand = Connection.CreateCommand()
                sqlcmd.CommandType = CommandType.Text
                sqlcmd.CommandText = SQLText

                result = sqlcmd.ExecuteScalar()
            End Using

            Return result
        End Function


        ''' <summary>Метод выполняет SQL запрос и возвращает скалярное значение типа TResult</summary>
        ''' <param name="Context">Экземпляр класса в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecScalar(Of TResult)(Context As SQLContext, ByVal SQLText As String) As TResult
            Return ExecScalar(Of TResult)(Context.OpenConnection, SQLText)
        End Function

        ''' <summary>Метод выполняет SQL запрос и возвращает скалярное значение типа TResult</summary>
        ''' <param name="Connection">Объект соединения в контексте которого будет выполнен запрос</param>
        ''' <param name="SQLText">Текст запроса SQL</param>
        <Extension>
        Public Function ExecScalar(Of TResult)(Connection As IDbConnection, ByVal SQLText As String) As TResult
            Dim result As Object

            Using sqlcmd As IDbCommand = Connection.CreateCommand()
                sqlcmd.CommandType = CommandType.Text
                sqlcmd.CommandText = SQLText

                result = sqlcmd.ExecuteScalar()
            End Using

            Return CType(result, TResult)
        End Function

    End Module

#End Region

End Namespace
